gusucode.com > LTE基带收发仿真系统matlab源码程序 > LTE baseband simulation/rec_process.m
function errTB = rec_process(recSymb,Hcell,h,iUE,SNRdB) % 接收端处理流程 % UE的基带处理函数,该函数仅用于数据信道,PDSCH在收端处理流程为: % 天线逆映射-->OFDM解调-->去子载波映射-->去预编码 MIMO检测--> % 去层映射-->解扰-->去速率匹配-->turbo译码-->CRC校验B-->CRC校验A % 输出为第iUE个用户可用TB正确、错误接收指示 % Author: 程式小组(徐萌 张妙 张晓庆) % Date: 2010-07-11 % ========================================================== global LTE_par Qm = LTE_par.UE_par.Qm(:,iUE); % 调制阶数 E = LTE_par.UE_par.E(:,iUE); % 速率匹配输出大小 CP = LTE_par.CP; % 循环前缀长度 nCB = LTE_par.UE_par.nCB(:,iUE); % 获取当前用户CB数 nTB = LTE_par.UE_par.nCW(iUE); % TB数目 nRx = LTE_par.UE_par.nAnt; % 接收端天线数 RNTI = LTE_par.UE_par.RNTI; % 无线网络临时指示 nLayer = LTE_par.UE_par.nLayer(iUE); % 用户层数 cellID = LTE_par.BS_par.cellID; % 小区ID号 FFT_SIZE = LTE_par.FFT_SIZE; % FFT点数 M_0_SYMB = LTE_par.UE_par.M_0_SYMB(iUE); % 码字0调制符号数 iSubFrame = LTE_par.iSubFrame; % 当前子帧号 取值为0~9 preProcess = LTE_par.UE_par.preProcess; % 预处理模式 if LTE_par.channelFreq == false % ================ 去OFDM ========================== % 对每个接收天线上的符号去循环前缀,并做OFDM解调 recMapSymbCell = de_ofdm(recSymb,FFT_SIZE,nRx,CP); else recMapSymbCell = cell(nRx,1); row = size(recSymb,2); col = size(recSymb,3); for iRx = 1:nRx recMapSymbCell{iRx} = reshape(recSymb(iRx,:,:),row,col); end end % ================ 去频谱搬移 ======================= % 实现频域位置交换{B A}-->{A B} for iRx = 1:nRx recMapSymbCell{iRx} = [recMapSymbCell{iRx}(FFT_SIZE/2+1:FFT_SIZE,:);recMapSymbCell{iRx}(1:FFT_SIZE/2,:)]; end % ================ 去载波映射 ======================= recPrecodedSymb = de_subcarr_mapping(recMapSymbCell,iUE); % 理想信道估计 HfreqCell = channel_est_real(Hcell,h,iUE); % % ================ 去预编码 ========================= recLayersymb = de_precoding(recPrecodedSymb,HfreqCell,iUE,SNRdB); % ================ 去层映射 ========================= recModSymbCell = de_layer_mapping(recLayersymb,nTB,nLayer,preProcess,M_0_SYMB); errTB = zeros(nTB,1); % 当前传输块出错记录 % 非零值表示出错 0表示正确 for iTB = 1:nTB recModSymb = recModSymbCell{iTB}; recScrambleBit = de_modulate(recModSymb,Qm(iTB)); f = de_scramble(recScrambleBit,iTB,RNTI,iSubFrame,cellID); errCB = zeros(nCB(iTB),1); % 当前CB块出错记录 saveInfoTB = []; for iCB = 1:nCB(iTB) % ============== 去码块级联 ==================== begin = (iCB-1)*E(iTB)+1; ending = begin+E(iTB)-1; preDerateMatchBit = f(begin:ending); % ============= 去速率匹配 ==================== preDecodeBit = de_rate_match(preDerateMatchBit,iUE,iTB); % ============= turbo 解码 ==================== decodedBit = turbo_decoder(preDecodeBit,SNRdB); % ============= crc解校验 ===================== if nCB(iTB) > 1 err = crcCheck24b(decodedBit); saveInfoTB = [saveInfoTB decodedBit(1:end-24)]; else err = crcCheck24a(decodedBit); end errCB(iCB) = err; end % ================ 码块合并后CRC24A 校验 ==================== if nCB(iTB) > 1 errTB(iTB) = crcCheck24a(saveInfoTB); else errTB(iTB) = errCB; end end